package com.cbw.dao.impI;

import com.cbw.bean.Express;
import com.cbw.dao.ExpressDao;
import com.cbw.utils.IOUtil;

import java.util.ArrayList;

/**
 * dao层操作数据增删改查的地方
 */
public class ExpressDaoImpI implements ExpressDao {
    private ArrayList<Express> data;//若增删改多，可以使用linkedlist

    private final int MAX=100; //快递柜最大存储数量

    //使用构造代码块完成集合初始化，构造方法也可
    //当创建Dao层对象时就会进行一个从磁盘读取数据的操作
    {
        data=IOUtil.readFromFile();
    }

    /**
     * //定义快递存放位置,不重复
     * @return
     */
    private int initTarget(){
        int target;
        do {
            target=(int)(Math.random()*MAX);//随机产生[0,100)之间的数
        }while (findTarget(target)!=-1);//
        return target; //返回没有被占用的坑位
    }

    /**
     * //判断指定位置是否已有快递
     * @param target
     * @return
     */
    private int findTarget(int target){
        //遍历集合，判断已有快递的target是否有与当前target一致
        for (int i = 0; i <data.size(); i++) {
            if (data.get(i).getTarget()==target){ //这个坑位被占用了
                return i;
            }
        }
        return -1;//坑位没有被占用
    }

    /**
     * 定义快递取件码，不重复
     * @return
     */
    private int initCode(){
        int code;
        do{
            code= (int)(Math.random() * 900000 + 100000);
        }while (findCode(code)!=-1);
        return code;
    }

    /**
     * 判断取件码是否已被使用
     * @param code
     * @return
     */
    private int findCode(int code) {
        //遍历集合，判断集合中已有快递的取件码与当前取件码是否有相同
        for (int i = 0; i < data.size(); i++) {
            if (data.get(i).getCode()==code){
                return i;
            }
        }
        return -1;
    }

    /**
     * 判断快递柜是否已经满了
     * @return
     */
    @Override
    public boolean checkFull() {
        return data.size()>=MAX; //若集合元素>=MAX则满
    }

    //以上是添加快递前的准备操作

    /**
     *添加快递信息
     * @param express
     * @return
     */
    @Override
    public Express add(Express express) {
        if(checkFull()){//满了
            return null;
        }
        express.setCode(initCode());
        express.setTarget(initTarget());
        data.add(express);//向集合添加快递
        IOUtil.writeToFile(data);//同步到文件中
        return express;
    }


    /**
     * 通过取件号删除快递
     * @param code
     * @return
     */
    @Override
    public Express removeByCode(int code) {
        int index = findCode(code);//先根据code查找
        if (index==-1) return null;//没找到
        Express remove= data.remove(index);//找到，移除
        IOUtil.writeToFile(data);//同步到文件中
        return remove;
    }

    /**
     * 通过单号删除快递
     * @param number
     * @return
     */
    @Override
    public boolean removeByNumber(String number) {
        int index=findByNumber(number);//查找对应单号快递所在索引
        if (index==-1) return false; //没找到，删除失败
        data.remove(index);//找到，并删除
        IOUtil.writeToFile(data);//同步到文件中
        return true;
    }

    /**
     * 通过单号查找快递，返回索引(位置),找不到返回-1
     * @param number
     * @return
     */
    @Override
    public int findByNumber(String number) {
        for (int i = 0; i < data.size(); i++) {
            if (number.equals(data.get(i).getNumber())){
                return i;
            }
        }
        return -1;
    }

    /**
     * 修改快递信息
     * 旧快递只保存了单号信息，通过单号信息找到旧快递位置，
     * 新快递(单号和公司名称由控制台输入)，取件码随机生成，然后将新快递放到就快点位置
     * @param oldExpress
     * @param newExpress
     * @return
     */
    @Override
    public Express modify(Express oldExpress, Express newExpress) {
        int index = findByNumber(oldExpress.getNumber());
        if (index!=-1){//通过单号找到待修改快递位置index
            newExpress.setTarget(data.get(index).getTarget());
            newExpress.setCode(initCode());
            data.set(index,newExpress);
            IOUtil.writeToFile(data);//同步到文件中
            return newExpress;
        }
        return null;
    }

    /**
     * 获取所有快递信息
     * @return
     */
    @Override
    public ArrayList<Express> getAll() {
        return data;
    }
}